<?php
//cpApp类
require_once ( dirname(__FILE__)."/cpBase.class.php" );
require_once ( dirname(__FILE__)."/cpError.class.php" );
require_once ( dirname(__FILE__)."/cpConfig.class.php" );
class cpApp extends cpBase
{
	//构造函数
    public function __construct($config=array())
	{
		//执行基类的构造函数
		parent::__construct();
		
		//如果开启静态页面缓存，则初始化静态缓存类
		if(self::$config['HTML_CACHE_ON']){
			require(BASE_PATH.'/cpHtmlCache.class.php');
			cpHtmlCache::init(self::$config);
		}
		
		//如果存在初始程序，则先执行初始程序
		if(file_exists(self::$config['MODULE_PATH'].self::$config['MODULE_INIT'])){
			require(self::$config['MODULE_PATH'].self::$config['MODULE_INIT']);
		}
		
		//检查指定模块是否存在
		if($this->_checkModule(self::$module)){
			$module=self::$module;
		}else if($this->_checkModule(self::$config['MODULE_EMPTY'])){
			$module=self::$config['MODULE_EMPTY'];
		}else{
			$this->error(self::$module."模块不存在");
		}
		
		//如果开启静态页面缓存，则尝试读取静态缓存
		if(false==$this->_readHtmlCache($module,self::$action)){
			$this->_execute($module);
		}
		
		//如果存在回调函数cp_app_end，则在即将结束前，调用回调函数
		if(function_exists('cp_app_end')){
			cp_app_end();
		}
	}

	//执行操作
    private function _execute($module){
		require_once(self::$config['MODULE_PATH'].$module.self::$config['MODULE_SUFFIX']);//加载模块文件
		
		//获取模块后缀
		$module_suffix=explode('.',self::$config['MODULE_SUFFIX'],2);
		$classname=$module.$module_suffix[0];//模块名+后缀名得到完整类名

		if(class_exists($classname)){
			$object=new $classname();//实例化模块对象		
			if($classname==self::$action){
				return true;//类和方法同名，直接返回，因为跟类同名的方法会当成构造函数，已经被调用，不需要再次调用
			}
			
			//获取动作
			$action="";
			if(method_exists($object, self::$action)){
				$action=self::$action;
			}
			else if(method_exists($object, self::$config['ACTION_EMPTY'])){
				$action=self::$config['ACTION_EMPTY'];
				if($this->_readHtmlCache($module,$action)){//解决空操作的静态页面缓存读取
					return true;
				}
			}else{
				$this->error(self::$action."操作方法在".$module."模块中不存在");
			}

			//执行指定模块的指定操作，相当于$object->$action();
			call_user_func(array(&$object, $action));
			
			//如果缓存开启，写入静态缓存，只有符合规则的，才会创建缓存
			$this->_writeHtmlCache();
		}else{
			$this->error($classname."类不存在");
		}
	}
	
	//检查模块文件是否存在,存在返回true，不存在返回false
	private function _checkModule($module){
		if(file_exists(self::$config['MODULE_PATH'].$module.self::$config['MODULE_SUFFIX'])){
			return true;
		}else{
			return false;
		}
	}
	
	//读取静态页面缓存
	private function _readHtmlCache($module='', $action=''){	
		//如果开启静态页面缓存，则尝试读取静态缓存
		if(self::$config['HTML_CACHE_ON']&&cpHtmlCache::read($module, $action)){
			return true;
		}
		return false;
	}
	
	//写入静态页面缓存
	private function _writeHtmlCache(){	
		//如果缓存开启，写入静态缓存，只有符合规则的，才会创建缓存
		if(self::$config['HTML_CACHE_ON']){
			cpHtmlCache::write();
		}
	}
}
?>